Apple II
Technical Notes
_____________________________________________________________________________
                                                  Developer Technical Support


Apple II Miscellaneous
#10:    80-Column GetChar Routine

Revised by:    Pete McDonald                                    November 1988
Written by:    Cameron Birse                                    December 1986

This Technical Note presents an 80-column GetChar routine.
_____________________________________________________________________________

The following is an example of how to display a string on the 80-column 
screen, reposition the cursor at the beginning of the string, and use the 
right arrow to get characters which are already there or accept new characters 
in their place.  The routine is a simple BASIC program which displays the 
string and repositions the cursor before getting incoming characters.  If the 
character input is a right arrow, the program calls the assembly language 
routine to get the character from screen memory at the current cursor 
location.

10  PRINT  CHR$ (4);"bload getchar.0": REM  first install assembly routine
20  B$ = "hello"
30  PRINT  CHR$ (4);"pr#3"
40  PRINT B$;:B$ = ""
50  A =  PEEK (1403): REM  get horiz location
60  A = A - 5: REM  move cursor to beginning of string
70  POKE 1403,A
80  GET A$: REM  get a character
90  IF A$ =  CHR$ (21) THEN  GOSUB 130: REM   if char is forward arrow,
    handle with assembly routine (GETCHAR)
100  IF A$ =  CHR$ (27) THEN 170: REM   if esc key then we're done
110  PRINT A$;:B$ = B$ + A$
120  GOTO 80
130  CALL 768: REM   GETCHAR
140  A =  PEEK (6)
150  A$ =  CHR$ (A)
160  RETURN 
170  PRINT : PRINT : PRINT B$: REM  and we're done

An assembled listing of the assembly language GetChar routine follows on the 
next page.

SOURCE   FILE #01 =>GETCHAR
----- NEXT OBJECT FILE NAME IS GETCHAR.0                     
0300:        0300    1           ORG   $300           
0300:        C01F    2 RD80VID   EQU   $C01F         ;80 COLUMN STATE
0300:        C054    3 TXTPAGE1  EQU   $C054         ;TURN OFF PAGE 2 (READ)
0300:        C055    4 TXTPAGE2  EQU   $C055         ;TURN ON PAGE 2 (READ)
0300:        C000    5 CLR80COL  EQU   $C000         ;TURN OFF 80 STORE (WRITE)
0300:        C001    6 SET80COL  EQU   $C001         ;TURN ON 80 STORE (WRITE)
0300:        0028    7 BASL      EQU   $28           ;BASE ADDRESS OF SCREEN LOCATION
0300:        0029    8 BASH      EQU   $29
0300:        057B    9 OURCH     EQU   $57B          ;80 COLUMNS HORIZ. POSITION
0300:        05FB   10 OURCV     equ   $5fb          ;80 col vertical pos
0300:        0006   11 char      equ   6             ;place to hand character back to basic
0300:               12 *
0300:               13 *************************************************************
0300:               14 *   GETCHAR - This routine gets an ascii character from the *
0300:               15 *   80 column display memory of the Apple IIe. It assumes   *
0300:               16 *   that main memory is switched in and that the base addrs *
0300:               17 *   of the line has already been calculated and resides     *
0300:               18 *   in BASL and BASH. It is meant to be called from BASIC   *
0300:               19 *   as follows:                                             *
0300:               20 *                     CALL 768                              *
0300:               21 *                     A = PEEK (6)                          *
0300:               22 *                     A$ = CHR$(A)                          *
0300:               23 *   As you can see, the character is returned in location   *
0300:               24 *   $6 in zero page. This routine is offered as an example. *
0300:               25 *   No guaranties are made regarding its fitness for any    *
0300:               26 *   purpose.           By Cameron Birse 6/10/86             *
0300:               27 *************************************************************
0300:               28 *
0300:        0300   29 getchr    equ   *             ;get the char at the current cursor loc.
0300:A9 01          30           lda   #$01          ;mask for horiz test
0302:2C 7B 05       31           bit   OURCH         ;are we in main or aux mem?
0305:D0 17   031E   32           bne   main          ;if bit 0 of OURCH is set, then main mem
0307:        0307   33 aux       equ   *
0307:AD 7B 05       34           lda   OURCH         ;get horiz pos.
030A:18             35           clc                 ;clear the carry for divide
030B:6A             36           ror   a             ;divide by two
030C:A8             37           tay                 ;put the result in y
030D:8D 01 C0       38           sta   SET80COL      ;turn on 80 store
0310:AD 55 C0       39           lda   TXTPAGE2      ;flip to aux text page
0313:B1 28          40           lda   (basl),y      ;get the character
0315:85 06          41           sta   char
0317:AE 54 C0       42           ldx   TXTPAGE1      ;turn off aux text page
031A:8D 00 C0       43           sta   CLR80COL      ;turn off 80 store
031D:60             44           rts
031E:        031E   45 main      equ   *
031E:AD 7B 05       46           lda   OURCH         ;get horiz pos.
0321:18             47           clc                 ;clear the carry for divide
0322:6A             48           ror   a             ;divide by two
0323:A8             49           tay                 ;put the result in y
0324:B1 28          50           lda   (basl),y      ;get the character
0326:85 06          51           sta   char
0328:60             52           rts


Further Reference
o    Apple IIGS Firmware Reference
o    Apple IIe Technical Reference Manual
o    Apple IIc Technical Reference Manual

